/*
* Copyright (C) 2019 ~ 2021 Uniontech Software Technology Co.,Ltd.
*
* Author:     yanghongwei <yanghongwei@uniontech.com>
*
* Maintainer: yanghongwei <yanghongwei@uniontech.com>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program.  If not, see <http://www.gnu.org/licenses/>.
*/

#include "mysql_session.h"

#include <Poco/Data/MySQL/Connector.h>
#include <Poco/Data/Session.h>
#include <Poco/Exception.h>

#include <plog/Log.h>

using namespace Poco::Data;

// 类型	大小	范围（有符号）	范围（无符号）	用途
// TINYINT	1 Bytes	(-128，127)	(0，255)	小整数值
// SMALLINT	2 Bytes	(-32 768，32 767)	(0，65 535)	大整数值
// MEDIUMINT	3 Bytes	(-8 388 608，8 388 607)	(0，16 777 215)	大整数值
// INT或INTEGER	4 Bytes	(-2 147 483 648，2 147 483 647)	(0，4 294 967 295)	大整数值
// BIGINT	8 Bytes	(-9,223,372,036,854,775,808，9 223 372 036 854 775 807)	(0，18 446 744 073 709 551 615)	极大整数值
// FLOAT	4 Bytes	(-3.402 823 466 E+38，-1.175 494 351 E-38)，0，(1.175 494 351 E-38，3.402 823 466 351 E+38)	0，(1.175 494 351 E-38，3.402 823 466 E+38)	单精度
// 浮点数值
// DOUBLE	8 Bytes	(-1.797 693 134 862 315 7 E+308，-2.225 073 858 507 201 4 E-308)，0，(2.225 073 858 507 201 4 E-308，1.797 693 134 862 315 7 E+308)	0，(2.225 073 858 507 201 4 E-308，1.797 693 134 862 315 7 E+308)	双精度
// 浮点数值
// DECIMAL	对DECIMAL(M,D) ，如果M>D，为M+2否则为D+2	依赖于M和D的值	依赖于M和D的值	小数值

// 类型	大小
// ( bytes)	范围	格式	用途
// DATE	3	1000-01-01/9999-12-31	YYYY-MM-DD	日期值
// TIME	3	'-838:59:59'/'838:59:59'	HH:MM:SS	时间值或持续时间
// YEAR	1	1901/2155	YYYY	年份值
// DATETIME	8	1000-01-01 00:00:00/9999-12-31 23:59:59	YYYY-MM-DD HH:MM:SS	混合日期和时间值
// TIMESTAMP	4	
// 1970-01-01 00:00:00/2038
// 结束时间是第 2147483647 秒，北京时间 2038-1-19 11:14:07，格林尼治时间 2038年1月19日 凌晨 03:14:07
// YYYYMMDD HHMMSS	混合日期和时间值，时间戳

// 类型	大小	用途
// CHAR	0-255 bytes	定长字符串
// VARCHAR	0-65535 bytes	变长字符串
// TINYBLOB	0-255 bytes	不超过 255 个字符的二进制字符串
// TINYTEXT	0-255 bytes	短文本字符串
// BLOB	0-65 535 bytes	二进制形式的长文本数据
// TEXT	0-65 535 bytes	长文本数据
// MEDIUMBLOB	0-16 777 215 bytes	二进制形式的中等长度文本数据
// MEDIUMTEXT	0-16 777 215 bytes	中等长度文本数据
// LONGBLOB	0-4 294 967 295 bytes	二进制形式的极大文本数据
// LONGTEXT	0-4 294 967 295 bytes	极大文本数据

MysqlSession *MysqlSession::m_instance = nullptr;

MysqlSession *MysqlSession::Instance()
{
    if (m_instance)
        return m_instance;

    m_instance = new MysqlSession;
    return m_instance;
}

MysqlSession::MysqlSession()
{
    m_session = nullptr;
    try {
        MySQL::Connector::registerConnector();
        m_session = new Session("MySQL", "host=127.0.0.1;port=3306;user=root;password=123;db=iot_server;compress=true;auto-reconnect=true");
    } catch (Poco::Exception &e) {
        LOGW << "connect mysql failed : " << e.what();
    }
}
